package com.spring.format.code.generation.util.file;

import java.util.Date;
import java.util.List;

import com.spring.format.code.generation.constants.Constants;
import com.spring.format.code.generation.constants.FileNameEnumType;
import com.spring.format.code.generation.mybatis.po.TablePO;
import com.spring.format.code.generation.mybatis.vo.CreateFileVO;
import com.spring.format.code.generation.mybatis.vo.JavaAttributeVO;
import com.spring.format.code.generation.util.CommonCodeUtil;
import com.spring.format.code.generation.util.FieldUtil;
import com.spring.format.code.generation.util.NameUtil;
import com.spring.format.code.generation.util.PathUtil;

/**
 * 文件生成帮助类
 * 
 * @author lenovo
 *
 */
public class CommonBizApiFileUtil {
	private CommonBizApiFileUtil() {

	}

	public static String content(CreateFileVO fileVO) {
		TablePO tablePO = fileVO.getTablePO();
		List<JavaAttributeVO> attrVOList = fileVO.getAttrVOList();
		// vo的类名
		String voName = NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.VO_NAME);
		// form的类名
		String formName = NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.FORM_NAME);
		StringBuilder attribute = new StringBuilder();
		// 拼接文件头
		attribute.append(head(tablePO));

		StringBuilder methodStr = new StringBuilder();
		// 新增数据
		methodStr.append(insert(formName));
		// 批量新增数据
		methodStr.append(insertBatch(formName));
		// 删除数据
		methodStr.append(delete());
		// 批量删除数据
		//methodStr.append(deleteBatch());
		// 编辑数据
		methodStr.append(update(formName));
		// 根据id查询
		methodStr.append(queryById(voName));
		// 查询分页
		methodStr.append(page(voName,formName));
		// 更改数据状态
		methodStr.append(editStatus());
		// 批量更新数据状态
		//methodStr.append(editStatusBatch());
		// // 根据or条件获取唯一数据
		// methodStr.append(queryUniqueByOr(formName));
		// // 根据or条件获取数据集合
		// methodStr.append(queryListByOr(formName));
		// 取数据集合
		methodStr.append(queryList(voName,formName));
		for (JavaAttributeVO attriVO : attrVOList) {
			// 特殊字段，特殊方法的追加代码(如排序字段，唯一索引字段，有自己方法的字段)
			methodStr.append(specialFieldAddition(attriVO, voName));
		}
		attribute.append(methodStr).append("} //end class");

		return attribute.toString();

	}

	/** 特殊字段需要特殊的方法追加 **/
	public static String specialFieldAddition(JavaAttributeVO attriVO, String voName) {
		StringBuilder specialFieldAddition = new StringBuilder();
		/** 自己update方法 **/
		if (FieldUtil.getHaveselfupdatefieldlist().indexOf(attriVO.getName()) >= 0) {
			specialFieldAddition.append(updateField(attriVO));
		}
		/** 自己query方法 **/
		if (FieldUtil.getHaveselfqueryfieldlist().indexOf(attriVO.getName()) >= 0) {
			specialFieldAddition.append(queryByField(voName, attriVO));
		}
		// 是否有唯一索引（未完成，有唯一索引的字段可以生成自己的方法，如：id，不过字段索引属性，在数据库里面很复杂，这里就不再实现了）
		return specialFieldAddition.toString();
	}

	// 拼接文件头
	public static String head(TablePO tablePO) {
		StringBuilder attribute = new StringBuilder();
		attribute.append("package ")
				.append(PathUtil.createPackagePath(tablePO.getTable_name(), FileNameEnumType.BIZ_API_NAME))
				.append("import java.util.List; \n").append("import ")
				.append(PathUtil.createImportPath(tablePO.getTable_name(), FileNameEnumType.VO_NAME)).append(";\n")
				.append("import ").append(Constants.RESINFO_PATH).append("; \n")

				.append("/**\n").append("  *").append(tablePO.getTable_comment()).append("\n").append("  *@author ")
				.append(System.getProperties().getProperty("user.name")).append("\n").append("  *@version 1.0.0 ")
				.append(DateUtil.dateFormat(new Date(), DateUtil.DATE_FORMAT)).append(" \n").append("  */\n")
				.append("public interface ")
				.append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.BIZ_API_NAME))
				.append("  { \n");

		return attribute.toString();
	}

	// 新增数据
	public static String insert(String formName) {
		StringBuilder methodStr = new StringBuilder();
		// 增加数据
		methodStr.append(CommonCodeUtil.methodRemark("增加数据")).append("  public ").append(Constants.RESINFO_VO)
				.append("<").append(formName).append(">").append(Constants.SERVICE_METHOD_ADD).append(" ( ")
				.append(formName).append("  vo ,").append(Constants.CONSUMER_LOGIN_VO).append(" loginVO ); \n ");

		return methodStr.toString();
	}

	// 批量新增数据
	public static String insertBatch(String formName) {
		StringBuilder methodStr = new StringBuilder();
		// 增加数据
		methodStr.append(CommonCodeUtil.methodRemark("批量增加数据")).append(CommonCodeUtil.apiMethodResultLogin("?", null,
				Constants.SERVICE_METHOD_ADD_BATCH, " List<" + formName + "> formList "));
		return methodStr.toString();
	}

	// 删除数据
	public static String delete() {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据id删除数据")).append(
				CommonCodeUtil.apiMethodResultLogin("?", null, Constants.DAO_METHOD_DELETE_BY_ID, " Integer id "));
		return methodStr.toString();
	}

	// 批量删除数据
	public static String deleteBatch() {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据id删除数据")).append(
				CommonCodeUtil.apiMethodResultLogin("?", null, Constants.DAO_METHOD_DELETE_BATCH, " Integer[] ids "));
		return methodStr.toString();
	}

	// 编辑数据
	public static String updateField(JavaAttributeVO attriVO) {
		StringBuilder methodStr = new StringBuilder();
		// 增加数据
		methodStr.append(CommonCodeUtil.methodRemark("编辑数据"))
				.append(CommonCodeUtil.apiMethodResultLogin("?", null, NameUtil.updateName(attriVO.getName()), attriVO.getType() +" "+attriVO.getName() + " Integer id "));
		return methodStr.toString();
	}

	// 编辑数据
	public static String update(String formName) {
		return update(formName, Constants.SERVICE_METHOD_UPDATE);
	}

	// 编辑数据
	public static String update(String formName, String methodName) {
		StringBuilder methodStr = new StringBuilder();
		// 增加数据
		methodStr.append(CommonCodeUtil.methodRemark("编辑数据"))
				.append(CommonCodeUtil.apiMethodResultLogin("?", null, methodName, formName + " paraForm "));
		return methodStr.toString();
	}

	// 根据 字段 查询数据
	public static String queryByField(String voName, JavaAttributeVO attriVO) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据" + attriVO.getName() + "查询数据"))
				.append(CommonCodeUtil.apiMethodResult("vo", voName, NameUtil.queryName(attriVO.getName()),
						attriVO.getType() + " " + attriVO.getName()));
		return methodStr.toString();
	}

	// 根据id查询数据
	public static String queryById(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据id查询数据"))
				.append(CommonCodeUtil.apiMethodResult("vo", voName, Constants.DAO_METHOD_QUERY_BY_ID, " Integer id "));
		return methodStr.toString();
	}

	// 查询分页信息
	public static String page(String voName,String formName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("查询分页")).append(
				CommonCodeUtil.apiMethodResult("list", voName, Constants.SERVICE_METHOD_QUERY_PAGE, formName + " paraForm "));
		return methodStr.toString();
	}

	// 更改数据状态
	public static String editStatus() {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据ids 更改数据状态")).append(CommonCodeUtil.apiMethodResultLogin("?",
				null, Constants.SERVICE_METHOD_EDIT_STATUS, " Integer state,Integer id "));
		return methodStr.toString();
	}

	// 更改数据状态
	public static String editStatusBatch() {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("7 根据ids 更改数据状态")).append(CommonCodeUtil.apiMethodResultLogin("?",
				null, Constants.SERVICE_METHOD_EDIT_STATUS_BATCH, " Integer state,Integer[] ids "));
		return methodStr.toString();
	}

	// 根据or条件查询唯一数据
	public static String queryUniqueByOr(String voName,String formName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据or条件获取唯一数据")).append(CommonCodeUtil.apiMethodResult("vo",
				voName, Constants.SERVICE_METHOD_QUERY_UNIQUE_BY_OR, formName + " paraForm "));
		return methodStr.toString();
	}

	// 根据or条件查询列表数据
	public static String queryListByOr(String voName,String formName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据 or 条件获取数据集合")).append(CommonCodeUtil.apiMethodResult("list",
				voName, Constants.SERVICE_METHOD_QUERY_LIST_BY_OR, formName + " paraForm "));
		return methodStr.toString();
	}

	// 根据条件查询列表数据
	public static String queryList(String voName,String formName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("10 获取数据集合")).append(
				CommonCodeUtil.apiMethodResult("list", voName, Constants.SERVICE_METHOD_QUERY_LIST, formName + " paraForm "));
		return methodStr.toString();
	}
}
